import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class AutoArchive {

    //定义最顶层的工作目录
    public static String TOP_FOLDER;
    //日期格式化工具
    public static SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

    /**
     * 开始归档文件
     * @param args[0] 第一个参数传一个文件夹的绝对路径,作为顶级工作目录,之后全在该目录下操作文件
     * @param args[1] 第二个参数传一个int型数字,以日期创建归档目录的时候,日期会加上该数字代表的天数,不传或传错则默认为0,会创建名为今天日期的归档目录
     */
    public static void main(String[] args) {
        //解析工作目录
        if (args.length == 0) {
            return;
        }else {
            File topFolder = new File(args[0]);
            if (topFolder.exists()) {
                TOP_FOLDER = topFolder.getPath();
            }else {
                return;
            }
        }

        //确定归档目录
        int day = 0;
        try {
            String str = args[1];
            day = Integer.valueOf(str);
        }catch (Exception e){
            e.printStackTrace();
        }
        Date today = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * day);
        String archiveFolderName = TOP_FOLDER + "\\" + sdf.format(today);
        File archiveFolder = new File(archiveFolderName);
        //首先判断有没有昨天的归档目录,没有则创建
        if (!archiveFolder.exists()) {
            archiveFolder.mkdir();
        }

        //遍历文件,进行移动
        File topFolder = new File(TOP_FOLDER);
        File[] listFiles = topFolder.listFiles();
        for (File file : listFiles) {
            //判断file是否需要进行归档(移动)
            if (isNeedToArchive(file)) {
                File dest = new File(archiveFolderName + "\\" + file.getName());
                while (dest.exists()) {
                    dest = buildCopyFile(dest);
                }
                file.renameTo(dest);
            }
        }
    }

    //判断该文件是否需要归档
    public static boolean isNeedToArchive(File file){
        try {
            //先判断file是否是文件夹
            if (file.isDirectory()) {
                //如果是文件夹且以日期格式命名的,则表示其不用移动
                sdf.parse(file.getName());
                return false;
            }else if ("desktop.ini".equals(file.getName())){
                return false;
            }else {
                return true;
            }
        }catch (ParseException e) {
            return true;
        }
    }

    //获取文件名(不包含扩展名)
    public static String getFileNameNoEx(File file) {
        String filename = file.getName();
        if ((filename != null) && (filename.length() > 0)) {
            int dot = filename.lastIndexOf('.');
            if ((dot >-1) && (dot < (filename.length()))) {
                return filename.substring(0, dot);
            }
        }
        return filename;
    }

    //获取文件扩展名
    public static String getExtensionName(File file) {
        String filename = file.getName();
        if ((filename != null) && (filename.length() > 0)) {
            int dot = filename.lastIndexOf('.');
            if ((dot >-1) && (dot < (filename.length() - 1))) {
                return filename.substring(dot + 1);
            }
        }
        return filename;
    }

    //生成副本文件(夹)
    public static File buildCopyFile(File file) {
        String copyName;
        if (file.isDirectory()) {
            copyName =file.getParent() + "\\" + file.getName() + "(副本-" + sdf.format(new Date()) + ")";
        }else {
            copyName =file.getParent() + "\\" + getFileNameNoEx(file) + "(副本-" + sdf.format(new Date()) + ")." + getExtensionName(file);
        }
        return new File(copyName);
    }

}
